package com.yunke.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yunke.dto.dazi.YunkeDaziCreateDto;
import com.yunke.dto.dazi.YunkeDaziJoinDto;
import com.yunke.dto.dazi.YunkeDaziListDto;
import com.yunke.entity.YunkeDazi;
import com.yunke.vo.dazi.YunkeDaziDetailVo;
import com.yunke.vo.dazi.YunkeDaziListVo;
import com.yunke.vo.dazi.YunkeTabClassVo;

import java.util.List;

/**
 * 云科搭子管理Service接口
 * 
 * @author yunke
 * @since 2024-01-01
 */
public interface YunkeDaziService extends IService<YunkeDazi> {

    /**
     * 获取搭子分类列表
     * 
     * @return 分类列表
     */
    List<YunkeTabClassVo> getCategoryList();

    /**
     * 发布搭子
     * 
     * @param createDto 发布参数
     * @return 搭子ID
     */
    Long createDazi(YunkeDaziCreateDto createDto);

    /**
     * 获取搭子列表
     * 
     * @param listDto 查询参数
     * @return 搭子列表
     */
    Page<YunkeDaziListVo> getDaziList(YunkeDaziListDto listDto);

    /**
     * 获取搭子详情
     * 
     * @param daziId 搭子ID
     * @return 搭子详情
     */
    YunkeDaziDetailVo getDaziDetail(Long daziId);

    /**
     * 参与搭子
     * 
     * @param joinDto 参与参数
     * @return 是否成功
     */
    boolean joinDazi(YunkeDaziJoinDto joinDto);

    /**
     * 退出搭子
     * 
     * @param daziId 搭子ID
     * @param quitReason 退出原因
     * @return 是否成功
     */
    boolean quitDazi(Long daziId, String quitReason);

    /**
     * 获取我发布的搭子
     * 
     * @param current 当前页
     * @param size 每页数量
     * @param status 状态筛选
     * @return 搭子列表
     */
    Page<YunkeDaziListVo> getMyPublishedDazi(Integer current, Integer size, Integer status);

    /**
     * 获取我参与的搭子
     * 
     * @param current 当前页
     * @param size 每页数量
     * @param status 状态筛选
     * @return 搭子列表
     */
    Page<YunkeDaziListVo> getMyJoinedDazi(Integer current, Integer size, Integer status);

    /**
     * 编辑搭子
     * 
     * @param daziId 搭子ID
     * @param updateDto 更新参数
     * @return 是否成功
     */
    boolean editDazi(Long daziId, YunkeDaziCreateDto updateDto);

    /**
     * 删除搭子
     * 
     * @param daziId 搭子ID
     * @return 是否成功
     */
    boolean deleteDazi(Long daziId);

    /**
     * 搭子置顶
     * 
     * @param daziId 搭子ID
     * @param topDays 置顶天数
     * @return 是否成功
     */
    boolean topDazi(Long daziId, Integer topDays);

    /**
     * 搭子审核
     * 
     * @param daziId 搭子ID
     * @param auditStatus 审核状态 1-通过 2-拒绝
     * @param auditRemark 审核备注
     * @return 是否成功
     */
    boolean auditDazi(Long daziId, Integer auditStatus, String auditRemark);

    /**
     * 审核参与申请
     * 
     * @param joinId 参与记录ID
     * @param auditStatus 审核状态 1-通过 2-拒绝
     * @param auditRemark 审核备注
     * @return 是否成功
     */
    boolean auditJoinApplication(Long joinId, Integer auditStatus, String auditRemark);

    /**
     * 增加浏览次数
     * 
     * @param daziId 搭子ID
     */
    void increaseViewCount(Long daziId);

    /**
     * 点赞/取消点赞搭子
     * 
     * @param daziId 搭子ID
     * @return 是否点赞（true-已点赞，false-已取消点赞）
     */
    boolean likeDazi(Long daziId);

    /**
     * 检查用户是否可以参与搭子
     * 
     * @param daziId 搭子ID
     * @param userId 用户ID
     * @return 是否可以参与
     */
    boolean canJoinDazi(Long daziId, Long userId);

    /**
     * 根据距离计算搭子列表
     * 
     * @param longitude 用户经度
     * @param latitude 用户纬度
     * @param radius 搜索半径（公里）
     * @param current 当前页
     * @param size 每页数量
     * @return 搭子列表
     */
    Page<YunkeDaziListVo> getNearbyDazi(String longitude, String latitude, Double radius, Integer current, Integer size);

    /**
     * 获取热门搭子
     * 
     * @param current 当前页
     * @param size 每页数量
     * @return 搭子列表
     */
    Page<YunkeDaziListVo> getHotDazi(Integer current, Integer size);

    /**
     * 搜索搭子
     * 
     * @param keyword 关键词
     * @param current 当前页
     * @param size 每页数量
     * @return 搭子列表
     */
    Page<YunkeDaziListVo> searchDazi(String keyword, Integer current, Integer size);
} 